package jmine.tec.script;

import java.io.Serializable;

/**
 * Representa o contexto de execução de um script.
 * 
 * @param <R> O tipo do resultado que a execução do script descrito no contexto irá devolver
 * @author jrenaut
 */
public interface ScriptExecutionContext<R> {

    /**
     * Devolve o nome do script. Este metodo pode / deve devolver um nome que identifica o script, do ponto de vista de negocio. Este método
     * pode devolver 'null' se nao houver nenhum nome apropriado.
     * 
     * @return String
     */
    String getScriptName();

    /**
     * Retorna o texto do Script.
     * 
     * @return String
     */
    String getScript();

    /**
     * Retorna o texto do Script de inicialização do contexto. Tipicamente deveria definir métodos que devem estar disponíveis para o Script
     * e formas de interagir com os objetos disponíveis no contexto de execução.
     * 
     * @return String
     */
    String getInitScript();

    /**
     * Retorna a classe de executor que deve ser usada para executar este context.
     * 
     * @return Class
     */
    Class<? extends ScriptExecutor> getScriptExecutorClass();

    /**
     * Retorna o identificador do Script.
     * 
     * @return Serializable
     */
    Serializable getScriptId();

    /**
     * Retorna a versão.
     * 
     * @return Long
     */
    Long getVersion();

    /**
     * Retorna o resultado da execução deste Script.
     * 
     * @return R
     */
    R getResult();

    /**
     * Callback chamado pelo executor do script antes do script ser executado de fato.
     */
    void beforeExecution();

    /**
     * Callback chamado pelo executor do script após a execução do script.
     */
    void afterExecution();

    /**
     * Retorna o Tracer.
     * 
     * @return tracer {@link String}
     */
    String getTracer();

    /**
     * @return {@link ScriptParameters}
     */
    ScriptParameters getParameters();

}
